package executors.demo;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Demo04 {
  public static void main(String[] args) {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
    
    // 正常执行
    scheduledExecutorService.execute(() -> {
      System.out.println(Thread.currentThread().getName());
      System.out.println("正常执行");
    });
    
    // 延迟执行
    scheduledExecutorService.schedule(() -> {
      System.out.println(Thread.currentThread().getName());
      System.out.println("延迟执行");
    }, 2, TimeUnit.SECONDS);
    
    // 周期执行 当前任务第一次延迟5s执行，然后每3s执行一次
    // 这个方法在计算下次执行时间时，是从任务刚刚开始时就计算
    scheduledExecutorService.scheduleAtFixedRate(() -> {
      try {
        Thread.sleep(3000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(System.currentTimeMillis() + ": 3");
    }, 2, 1, TimeUnit.SECONDS);
    
    // 周期执行，当前任务第一次延迟5s执行，然后没3s执行一次
    // 这个方法在计算下次执行时间时，会等待任务结束后，再计算时间
    scheduledExecutorService.scheduleWithFixedDelay(() -> {
      try {
        Thread.sleep(3000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(System.currentTimeMillis() + "：3");
    }, 2, 1, TimeUnit.SECONDS);
  }
}
